package hdb.dao;

import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;


import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import hdb.dto.EinkaufslisteDTO;
import hdb.om.Einkaufsliste;
import hdb.om.Artikel;
import hdb.om.Vorrat;
import hdb.om.LagerTyp;

/**
 * The Data access class for bying list. All Interaction with the database
 * regarding the entity bean Einkaufsliste should be handled by this class!
 * @author juergen.schoenwaelder@stud.fh-deggendorf.de, 
 * 			thomas.eberhart@stud.fh-deggendorf.de
 */
public class EinkaufslisteDao extends HibernateDaoSupport {
	SimpleDateFormat deutschesDatumsFormat = new SimpleDateFormat("dd.MM.yyyy hh:mm");

		/**
		 * returns a single bying list by its primary db key
		 * @param id
		 * @return a single Einkaufsliste
		 */
		public Einkaufsliste findById(int id) {
			HibernateTemplate template = getHibernateTemplate();
			return (Einkaufsliste) template.get(Einkaufsliste.class, id);
		}
		
		/**
		 * Returns all bying lists from the database.
		 * @return a list of Einkaufliste
		 * @see Einkaufsliste
		 */
		@SuppressWarnings("unchecked")
		public List<Einkaufsliste> findAll() {
			HibernateTemplate template = getHibernateTemplate();
			
//			SessionFactory hibernateSessionFactory = template.getSessionFactory();
//			Session sess = hibernateSessionFactory.getCurrentSession();
//			SQLQuery sqlQuery = sess.createSQLQuery("SELECT * FROM vorrat");
//			List vorrat = sqlQuery.list();
			
//			Criteria crit = sess.createCriteria(Vorrat.class);
//			List vorrat = crit.list();
//			return vorrat;
			
			return template.loadAll(Einkaufsliste.class);
		}

		/**
		 * modifies an existing bying list in the database which is selected by its primary key.
		 * @param id the primary key of the bying list
		 * @param name the new name for the item
		 * @see Einkaufsliste
		 */
		public void modify(int id, int artikelId) {
			HibernateTemplate template = getHibernateTemplate();			
			Einkaufsliste e = (Einkaufsliste) template.get(Einkaufsliste.class, id);
			Artikel a = (Artikel) template.get(Artikel.class, artikelId);
			e.setArtikel(a);
			template.saveOrUpdate(e);
		}

		/**
		 * creates a new persistent einkaufsliste in the database providing all the necessary details.
		 * @param anzahl the new size of the stock
		 * @param name the name for the new item
		 * @param hauptkategorie the main-category of the item (e.g. "drinks")
		 * @param unterkategorie the sub-category of the item (e.g. "juice")
		 * @param geschaeft the store where the item was purchased (e.g. "ALDI")
		 * @param mbestand the number of units where the item must be purchased
		 * @see Einkaufsliste
		 */
		public void create(int anzahl) {
			HibernateTemplate template = getHibernateTemplate();
			Vorrat vorrat = new Vorrat(anzahl);
			template.persist(vorrat);
		}
		
		/**
		 * Create a bying list specifying a Artikel id.
		 * @param artikelId
		 * 
		 */
//		public void anlegen(int artikelId, Set<Integer> lagertypIds) {
//			HibernateTemplate template = getHibernateTemplate();
//			Artikel a = (Artikel) template.get(Artikel.class, artikelId);
//			Set<LagerTyp> lagertyp = new HashSet<LagerTyp>();
//			for(Integer lagertypId : lagertypIds) {
//				lagertyp.add((LagerTyp) template.get(LagerTyp.class, lagertypId));
//			}
//			Vorrat v = new Vorrat();
//			v.setArtikel(a);
//			v.setLagertyp(lagertyp);
//			template.saveOrUpdate(v);
//		}
		
		public void erzuegen(int artikelId) {
			HibernateTemplate template = getHibernateTemplate();
			Artikel a = (Artikel) template.get(Artikel.class, artikelId);
						
			Einkaufsliste e = new Einkaufsliste();
			e.setArtikel(a);
			template.saveOrUpdate(e);
		}		
		
/*
		*//**
		 * returns the list of items which are currently on a purchase list.
		 * @return a List of Einkaufsliste
		 */
		
		public List<Einkaufsliste> findMenge() {
			HibernateTemplate template = getHibernateTemplate();
			String hqlString = "select v, art from Vorrat v, Artikel art where v.artikel.id=art.id and v.anzahl-art.mbestand<=0";
			@SuppressWarnings("unchecked")
			List<Einkaufsliste> einkaufsliste = template.find(hqlString);
			return einkaufsliste;
		}
			
		/**
		 * deletes a bying list using it's id.
		 * @param id
		 * @throws EinkaufslisteDeleteException if there are Einkaufsliste objects involving the item.
		 */
		public void deleteById(int id) throws EinkaufslisteDeleteException {
			HibernateTemplate template = getHibernateTemplate();
			Einkaufsliste e = findById(id);
//			Set<Einkaufsliste> e = e.getEinkaufsliste();
//			if ((e == null) || (e.size() == 0)) {
				template.delete(e);
//			} else {
//				throw new EinkaufslisteDeleteException();
//			}
		}
}
